BPMN - Handle External Task
Persiapan
- BPMN (dengan send task atau external task)
- Deploy BPMN
- Siapkan instances pada send task atau external task

Kode
Melanjutkan dari project gin silahkan buat file BPMN/externalTask.go.
Struktur folder project akan seperti ini :

Pasang Camunda REST API Client, dengan menjalankan command berikut ini pada terminal :
go get github.com/citilinkru/camunda-client-go/v3
Buka file externalTask.go tambahkan function HandleExternalTask.
import (
"fmt"
camunda_client_go "github.com/citilinkru/camunda-client-go/v3"
"github.com/citilinkru/camunda-client-go/v3/processor"
"time"
)
func HandleExternalTask() {
//create client
client := camunda_client_go.NewClient(camunda_client_go.ClientOptions{
EndpointUrl: "http://localhost:8082/engine-rest",
ApiUser: "demo",
ApiPassword: "demo",
Timeout: time.Second * 10,
})
//create external task processor
logger := func(err error) {
fmt.Println(err.Error())
}
proc := processor.NewProcessor(client, &processor.Options{
WorkerId: "worker1",
LockDuration: time.Second * 5,
MaxTasks: 10,
MaxParallelTaskPerHandler: 100,
}, logger)
//add and subscribe external task handler
proc.AddHandler(
[]*camunda_client_go.QueryFetchAndLockTopic{
{
TopicName: "notifAduanDibuatSekretariatTU",
},
},
func(ctx *processor.Context) error {
fmt.Printf("Running task %s. WorkerId: %s. TopicName: %s\n", ctx.Task.Id, ctx.Task.WorkerId, ctx.Task.TopicName)
err := ctx.Complete(processor.QueryComplete{
Variables: &map[string]camunda_client_go.Variable{
"result": {Value: "Hello world!", Type: "string"},
},
})
var retryTimeout int
var retries int
var errTxt string
if err != nil {
fmt.Printf("Error set complete task %s: %s\n", ctx.Task.Id, err)
return ctx.HandleFailure(processor.QueryHandleFailure{
ErrorMessage: &errTxt,
Retries: &retries,
RetryTimeout: &retryTimeout,
})
}
fmt.Printf("Task %s - %s completed\n", ctx.Task.Id, ctx.Task.TopicName)
return nil
},
)
}
Create Client
Pada bagian ini, silahkan ada sesuaikan dengan setting camunda cockpit anda.
client := camunda_client_go.NewClient(camunda_client_go.ClientOptions{
EndpointUrl: "http://localhost:8082/engine-rest",
ApiUser: "demo",
ApiPassword: "demo",
Timeout: time.Second * 10,
})
```Create external task processor
Pada bagian ini, silahkan atur
workerIdyang ingin anda gunakan.proc := processor.NewProcessor(client, &processor.Options{
WorkerId: "worker1",
LockDuration: time.Second * 5,
MaxTasks: 10,
MaxParallelTaskPerHandler: 100,
}, logger)Add and subscribe external task handler
Pada bagian ini, silahkan sesuaikan nama topic, sesuai dengan BPMN anda.
proc.AddHandler(
[]*camunda_client_go.QueryFetchAndLockTopic{
{
TopicName: "notifAduanDibuatSekretariatTU",
},
},
...
Setelah membuat function tersebut, silahkan menuju ke file example.go atau main, lalu panggil function tadi di dalam main.
package main
import (
"example/hello/BPMN"
"github.com/gin-gonic/gin"
)
func main() {
//call handle external task function
BPMN.HandleExternalTask()
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "hello world",
})
})
err := r.Run()
if err != nil {
return
} // listen and serve on 0.0.0.0:8080
}
Lalu, jalankan project golang anda, jika berjalan sukses, anda dapat memeriksa log, dan mendapatkan pesan seperti ini.
Running Task Completed.


referensi :